package com.cskaoyan.javase.oop2._1extends._9override;

/**
 * 方法覆盖/重写的语法
 * 再讲解具体语法之前,我们先学习一个注解@Override
 *      该注解放在子类重写父类方法的方法头上面
 *      用来判断这个子类重写父类方法,是否合法
 *      如果是方法重写 则通过编译
 *      否者会编译报错
 *
 * 强制要求:
 *      在java代码中,任何重写自父类的方法
 *      都应该添加注解@Override,不添加注解重写方法是错误的做法
 *      为什么?
 *          1.因为注解首先会检查语法,避免造成重写的误解.
 *          2.提升代码可读性(只要是这个注解标记的方法,肯定是重写自父类的方法,不会是自定义的方法)
 *
 * 语法:
 * 对于父类中需要被重写的成员方法:
 * [访问权限修饰符] 返回值类型 方法名(形参列表){
 *  // 方法体
 * }
 * 子类重写该方法的语法要求是:
 *      1.子类重写父类方法,访问权限修饰符不需要保持一致,允许更宽松,但是不允许更严格
 *      当然保持一致也可以
 *
 *      2.子类重写父类方法,返回值类型并不要求完全一致,需要保持兼容.
 *      何为兼容呢?
 *      请大家自行测试一下
 *      考虑三个角度:
 *          1.void
 *          2.基本数据类型返回值类型
 *          3.引用数据类型返回值类型
 *
 *     3.子类重写父类方法,方法名必须强制保持一致,不能有任何不同.
 *     4.子类重写父类方法,形参列表必须保持一致,不能有任何不同.
 *     5.子类重写父类方法,方法体没有任何要求,完全可以和父类方法保持一致,也可以空着,总之没有要求.
 *
 * 思考:
 *      为什么方法的重写语法要这么设置?(没有意义)
 *      因为Java存在父类引用指向子类对象
 *      调用方法时,访问范围看引用
 *      调用结果却看对象
 *
 * 十年前的面试题:
 * 方法的重载 vs 方法的重写
 * 首先是发生的类:
 *      1.方法的重载必须在同一个类中
 *      2.方法的重写必须发生在父子类中,必须有两个类
 * 访问权限修饰符:
 *      1.方法的重载没有要求
 *      2.方法的重写不能更严格
 * 返回值类型:
 *      1.方法的重载没有要求
 *      2.方法的重写,需要保持兼容
 * 方法名:
 *      1.方法的重载必须保持一致
 *      2.方法的重写必须保持一致
 * 形参列表:
 *      1.方法的重载,必须要求不一致
 *      2.方法的重写,必须一致
 * 方法体:
 *      1.方法的重载没有要求
 *      2.方法的重写没有要求
 *
 *
 *
* @since 10:08
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        Phone p = new IPhone();
        p.call();
    }
}

class Phone {
    public void call() {
        System.out.println("打电话!");
    }
}

class IPhone extends Phone {
    public void playGame() {
        System.out.println("玩游戏!");
    }

    @Override
    public void call() {
        System.out.println("嘿siri,帮我打电话!");
    }
}